package rtka

import (
	"bufio"
	"io"
	"os"
	"time"
)

// MonitorFile 监控文件并读取新增内容（优化版）
func MonitorFile(filename string, onReadLine func(line []byte), onError func(err error)) {
	var (
		file      *os.File
		reader    *bufio.Reader
		beginSeek int64 = 0
		lastSize  int64 = -1
	)

	closeFile := func() {
		if file != nil {
			_ = file.Close()
			file = nil
			reader = nil
		}
	}

	openFile := func() error {
		closeFile() // 先关闭现有文件

		f, err := os.Open(filename)
		if err != nil {
			return err
		}

		// 设置读取位置
		if lastSize == -1 {
			// 首次打开，从文件末尾开始
			beginSeek, _ = f.Seek(0, io.SeekEnd)
		} else {
			// 非首次打开，从上次位置开始
			beginSeek, _ = f.Seek(beginSeek, io.SeekStart)
		}

		file = f
		reader = bufio.NewReader(file)
		return nil
	}

	for {
		// 确保文件已打开
		if file == nil {
			if err := openFile(); err != nil {
				if onError != nil {
					onError(err)
				}
				time.Sleep(1 * time.Second)
				continue
			}
		}

		// 检查文件状态
		fileInfo, err := file.Stat()
		if err != nil {
			if onError != nil {
				onError(err)
			}
			closeFile()
			continue
		}

		currentSize := fileInfo.Size()

		// 处理文件被截断的情况（如日志轮转）
		if currentSize < lastSize {
			beginSeek = 0
			if _, err = file.Seek(0, io.SeekStart); err != nil {
				if onError != nil {
					onError(err)
				}
				closeFile()
				continue
			}
			reader = bufio.NewReader(file)
		}
		lastSize = currentSize

		// 读取新增内容
		for {
			line, err := reader.ReadBytes('\n')
			if err != nil {
				if err != io.EOF {
					if onError != nil {
						onError(err)
					}
					closeFile()
				}
				break
			}

			// 处理读取到的行
			if len(line) > 0 {
				onReadLine(line)
				beginSeek, _ = file.Seek(0, io.SeekCurrent)
			}
		}

		// 短暂休眠
		time.Sleep(100 * time.Millisecond)
	}
}
